﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BodaNetCommunications.FinsComs.FinsUtils
{
    public class FinsErrors
    {
        public static Dictionary<byte, string> HeaderError = new Dictionary<byte, string>()
        {
            { 0x00,"正常"},
            { 0x01,"数据头不是FINS或ASCII格式"},
            { 0x02,"数据长度过长"},
            { 0x03,"命令（Header功能码）错误"},
            { 0x20,"连接/通信被占用"},
            { 0x21,"指定的节点已经被连接"},
            { 0x22,"尝试从未描写的IP地址访问受保护节点"},
            { 0x23,"客户端FINS节点地址超出范围"},
            { 0x24,"客户端和服务器正在使用相同的FINS节点地址"},
            { 0x25,"所有可供分配的节点地址都已被使用"},
        };

        private static List<CommandErrorItem> ResponseError = new List<CommandErrorItem>()
        {
            new CommandErrorItem{
                ErrorCode=0x00,
                Description="正常完成",
                SubError=new List<CommandErrorItem>{
                    new CommandErrorItem{ ErrorCode=0x01,Description="服务中断",Suggest="检查第三个节点的目标传输区域的内容，或者检查数据链路状态"}
                }
            },
            new CommandErrorItem{
                ErrorCode=0x01,
                Description="本地节点错误",
                SubError=new List<CommandErrorItem>{
                    new CommandErrorItem{ ErrorCode=0x01,Description="本地节点不是网络的一部分",Suggest="检查本地网络连接状态。"},
                    new CommandErrorItem{ ErrorCode=0x02,Description="令牌超时，节点号太大",Suggest="将本地节点的节点号设置为低于最大节点号。"},
                    new CommandErrorItem{ ErrorCode=0x03,Description="超出传输重试次数",Suggest="用节间回波测试检查通信。如果测试失败，请检查网络。"},
                    new CommandErrorItem{ ErrorCode=0x04,Description="超出最大帧数",Suggest="检查网络中事件的执行情况，减少一个周期内发生的事件数，或增加最大帧数。"},
                    new CommandErrorItem{ ErrorCode=0x05,Description="节点编号设置错误（范围）",Suggest="确保节点编号在指定范围内，并且没有重复的节点编号。"},
                    new CommandErrorItem{ ErrorCode=0x06,Description="节点号复制错误",Suggest="确保没有重复的节点号。"},
                }
            },

            // 0x02
            // 0x03
            // 0x04
            // 0x05

            new CommandErrorItem{
                ErrorCode=0x10,
                Description="命令格式错误",
                SubError=new List<CommandErrorItem>{
                    new CommandErrorItem{ ErrorCode=0x01,Description="该命令长于最大允许长度",Suggest="检查命令的命令格式并正确设置。。"},
                    new CommandErrorItem{ ErrorCode=0x02,Description="该命令小于最小允许长度",Suggest="检查命令的命令格式并正确设置。"},
                    new CommandErrorItem{ ErrorCode=0x03,Description="指定的数据项数量与实际数量不同",Suggest="检查项目数量和数据，确保它们一致。"},
                    new CommandErrorItem{ ErrorCode=0x04,Description="使用了错误的命令格式",Suggest="检查命令的命令格式并正确设置。"},
                    new CommandErrorItem{ ErrorCode=0x05,Description="使用了不正确的标头（本地节点的中继表或中继节点的本地网络表错误。）",Suggest="正确设置路由表。"},
                }
            },
            // .....
    
        };

        public static string GetCommandError(byte mainCode, byte subCode)
        {
            // 根据主码获取主码异常描述
            var main = ResponseError.FirstOrDefault(mc => mc.ErrorCode == mainCode);
            if (main != null)
            {
                // 检查对应的子码
                var sub = main.SubError.FirstOrDefault(sc => sc.ErrorCode == subCode);

                if (sub != null)
                    return $"[{mainCode}-{subCode}]" + main.Description + "。详细：" + sub.Description + "。建议：" + sub.Suggest;

                else
                    return $"[{mainCode}-{subCode}]异常子码无法识别，未知异常";
            }
            else
            {
                return $"[{mainCode}]异常主码无法识别，未知异常";
            }
        }
    }

    public class CommandErrorItem
    {
        public byte ErrorCode { get; set; }
        public string Description { get; set; }
        public string Suggest { get; set; }

        public List<CommandErrorItem> SubError { get; set; }
    }
}
